共计 4025 个字符,预计需要花费 11 分钟才能阅读完成。
本文来自 :https://www.cnblogs.com/yang1333/articles/12609714.html#3177870913
1. XML 文档模板
<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank updated="yes">2</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank updated="yes">5</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank updated="yes">69</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>
2. 查看
"""
# 注意: 返回值都是对应的标签节点对象.
print(root.iter('year')) # 全文搜索
print(root.find('country')) # 在 root 的子节点找,只找一个
print(root.findall('country')) # 在 root 的子节点找,找所有 (类始于 subprocess 中的找到所有 sections)
"""
import xml.etree.ElementTree as ET # 这样导入的好处就是 xml 和 etree 包中的功能都能直接使用. 同时三者可以结合使用
# 打开文件, 读出 xml 文件对象
tree = ET.parse('db.xml') # 如上 xml 模板存入 db.xml 文件中
print(tree) # <xml.etree.ElementTree.ElementTree object at 0x0000023703B24070>
# 读出顶级节点对象 date
root = tree.getroot()
print(root) # <Element 'data' at 0x0000023703C7E720>
# 查找三种方式
# 1. 全文搜索: root.iter('year')
res = root.iter("year")
print(res) # <_elementtree._element_iterator object at 0x0000023EE649DE50>
for year in res:
print(''.center(50,'-'))
print(year.tag) # 获取 year 节点对象的标签名
print(year.attrib) # 获取 year 节点对象的属性. 以 key:value 对的形式输出. key 代指属性名, value 代指属性值
print(year.text) # 获取 year 节点对象中的文本内容.
"""
--------------------------------------------------
year
{'update': 'no'}
2018
--------------------------------------------------
year
{'update': 'no'}
2021
--------------------------------------------------
year
{'update': 'no'}
2021
"""
# 2. 在 root 的子节点找,只找一个: root.find('country')
res = root.find('country')
print(res.tag) # country
print(res.attrib) # {'name': 'Liechtenstein'}
print(res.text) # 文本内容为空
# 递归查找 country 下的 year. 并获取其标签名, 属性, 文本内容
res = root.find('country').find('year') # 等同于接着上面的继续, res.find('year')
print(res) # <Element 'year' at 0x000002A64D5BD590>
print(res.tag) # year
print(res.attrib) # {'update': 'no'}
print(res.text) # 2018
# 3. 在 root 的子节点找所有: root.findall("country")
res = root.findall("country")
print(res) # [<Element 'country' at 0x00000253D3A9E770>, <Element 'country' at 0x00000253D3ACD810>, <Element 'country' at 0x00000253D3ACDAE0>]
for country in res:
print(''.center(50,'-'))
res = country.find('year')
print(res.tag)
print(res.attrib)
print(res.text)
'''
--------------------------------------------------
year
{'update': 'no'}
2018
--------------------------------------------------
year
{'update': 'no'}
2021
--------------------------------------------------
year
{'update': 'no'}
2021
'''
3. 修改
import xml.etree.ElementTree as ET
tree = ET.parse('db.xml')
root = tree.getroot()
# 需求: 把 "db.xml" 文件中的 country 所有 year 标签属性名改为 no, 标签文本加 10
for year in root.iter('year'):
print(year)
year.text = str(int(year.text) + 10) # 注意: "db.xml" 使用 year.text 读出, 默认是字符串, 我们要使用 int 转换成整型才能进行数字运算.
year.attrib = {'update': 'no'}
tree.write('db.xml')
# 需求: 把 "db.xml" 文件中的 country 下所有 gdppc 标签文本加 10000
for gdppc in root.iter('gdppc'):
print(gdppc)
gdppc.text = str(int(gdppc.text) + 10000)
tree.write('db.xml')
4. 增加
import xml.etree.ElementTree as ET
tree = ET.parse('db.xml')
root = tree.getroot()
for country in root.iter('country'):
year = country.find("year")
if int(year.text) > 2010:
# 1. 调用 ET.Element() 方法增加标签, 属性, 文本
flag = ET.Element('egon') # 2. 添加标签
flag.attrib = {'DSB': 'yes'} # 3. 为添加的 flag 标签对象添加属性
flag.text = '大帅逼 1' # 4. 为添加的 flag 标签对象添加文本内容
country.append(flag) # 5. 把添加的 flag 标签对象追加到 country 标签中, 作为 country 的子节点标签对象.(往 country 节点下添加子节点)
tree.write("db.xml")
5. 删除
import xml.etree.ElementTree as ET
tree = ET.parse('db.xml')
root = tree.getroot()
# 需求: 在所有的 country 标签节点对象下的 rank 如果它的文本内容大于 50, 那么就删除这个 country
for country in root.findall('country'):
rank = int(country.find('rank').text)
if rank > 50:
root.remove(country)
tree.write('db.xml')
6. 新建 XML 文档
import xml.etree.ElementTree as ET
new_xml = ET.Element("country") # 创建标签 country 节点, 返回 new_xml 节点对象
name = ET.SubElement(new_xml, "name", attrib={"update": "yes"}) # 在 new_xml 节点对象下创建标签名为 "name" 的子节点对象, 并指定属性
name.text = 'egon' # 为 "name" 字节的点对象添加文本内容
age = ET.SubElement(new_xml, 'year', attrib={'update': 'no'})
age.text = '18'
sex = ET.SubElement(new_xml, 'sex')
sex.text = 'male'
et = ET.ElementTree(new_xml) # 生成文档对象
et.write('text.xml', encoding='utf-8', xml_declaration=True) # 创建文件, 将该文档对象 "et" 写入.
正文完